#include "Lista.h"
#include "Utils.h"
#include <sstream>
using namespace Entidades;

Lista::Lista() {
	this->eleccion = new Eleccion();
}

Eleccion *Lista::getEleccion() const {
	return eleccion;
}

string Lista::getNombre() const {
	return nombre;
}

void Lista::setEleccion(int fecha, string cargo) {
	this->eleccion->setFecha(fecha);
	this->eleccion->setCargo(cargo);
}

void Lista::setNombre(string nombre) {
	this->nombre = nombre;
}

void Lista::hidratarse(char* buffer, unsigned int tamanioDelBuffer) {

	//escribo el buffer en el stringStream
	stringstream* ss = new stringstream(stringstream::in | stringstream::out | stringstream::binary);
	ss->seekg(0, ios::beg);
	ss->write(buffer, tamanioDelBuffer);

	//Eleccion (fecha int, Cargo -string cargoPrincipal-)
	unsigned int fechaDeEleccion;
	ss->read((char*) &(fechaDeEleccion), sizeof(int));
	this->eleccion->setFecha(fechaDeEleccion);
	this->eleccion->setCargo(Utils::ObtenerSiguienteStringVariable(ss));

	//string nombre
	this->nombre = Utils::ObtenerSiguienteStringVariable(ss);

	delete ss;
}

char* Lista::construirBuffer() {

	//agrupo los atributos
	stringstream* ss = new stringstream(stringstream::in | stringstream::out | stringstream::binary);
	ss->seekp(0, ios::end);

	//Eleccion (fecha int, Cargo -string cargoPrincipal-)
	unsigned int fecha = this->eleccion->getFecha();
	ss->write((char*) &(fecha), sizeof(int));
	unsigned int tamanioDelCargo = this->eleccion->getCargo()->getNombre().size();
	ss->write((char*) &tamanioDelCargo, sizeof(int));
	ss->write(this->eleccion->getCargo()->getNombre().c_str(), tamanioDelCargo);

	//string nombre
	unsigned int tamanioDelNombre = this->nombre.size();
	ss->write((char*) &tamanioDelNombre, sizeof(int));
	ss->write(this->nombre.c_str(), tamanioDelNombre);

	//construyo el buffer
	unsigned int tamanioDelBuffer = this->getTamanioDelBuffer();
	char* buffer = new char[tamanioDelBuffer];
	ss->read(buffer, tamanioDelBuffer);
	delete ss;

	//lo devuelvo
	return buffer;
}

unsigned int Lista::getTamanioDelBuffer() {
	return (4 * sizeof(int)) + this->eleccion->getCargo()->getNombre().size() + this->nombre.size();
}

void Lista::marcarComoBorrado() {

}

Lista::~Lista() {
	delete this->eleccion;
}

